home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / varinc.lzh / PAGE271.C < prev    next >
C/C++ Source or Header  |  1979-11-30  |  4KB  |  91 lines

  1. /* SOURCE FILE:  INVMAINT.C */
  2. /*****************************************************************************/
  3. /* Inventory file maintenance: lists and adds parts to inventory.            */
  4. /*****************************************************************************/
  5.  
  6. #include <stdio.h>
  7. #include <fcntl.h>
  8. #include <sys\types.h>
  9. #include <sys\stat.h>
  10. #include <io.h>
  11. #include <stddefs.h>
  12.  
  13. /* Macros PROMPT and ERR_EXIT use read() and write() to perform user I/O */
  14. #define PROMPT(msg, mlen, ans, alen) write(stdout, msg, mlen), \
  15. ans[read(stdin, ans, alen) - 1] = '\0'
  16. #define ERR_EXIT(s1) write(stderr, s1, strlen(s1)), \
  17. write(stderr, "\7\n", 2), exit(FAIL)
  18.  
  19. main()
  20.    {
  21.    IMPORT long atol(char[]);
  22.    int fh_inv;                                   /* invntory.dat file handle */
  23.    long part_num;                                     /* integer part number */
  24.    char cmd;                                  /* command to add or list part */
  25.    char reply[81];                      /* user input buffer to hold replies */
  26.    char buf[20];                   /* buffer for binary-to-ASCII conversions */
  27.    struct s_inv_rec                   /* Declare structure type; define tag. */
  28.       {
  29.       long price;                      /* price to charge for part, in cents */
  30.       short weight;                            /* shipping weight, in ounces */
  31.       char desc[31];                                  /* description of part */
  32.       };
  33.    struct s_inv_rec inv_rec;               /* Declare record struct inv_rec. */
  34.  
  35.    /* Open inventory file invntory.dat for reading and writing. Create */
  36.    /*   the file if it does not exist, and open it in binary mode.     */
  37.    if (-1 == (fh_inv = open("invntory.dat", O_RDWR | O_CREAT | O_BINARY)))
  38.       ERR_EXIT("No file: invntory.dat");
  39.    
  40.    while (1)                /* Infinite loop; exit is in loop body. */
  41.  
  42.       {
  43.  
  44.       /* Prompt for command: Add or List? <a/l> */
  45.       PROMPT("\nInventory Maint: Add or List? <a/l> ", 37, reply, 80);
  46.       cmd = reply[0];
  47.  
  48.       /* No cmd, so we're done. */
  49.       if (cmd != 'a' && cmd != 'l') 
  50.          close(fh_inv), exit(SUCCEED);
  51.  
  52.       /* Prompt for part number to add or list. */
  53.       PROMPT("\nPart #: ", 9, reply, 80);
  54.       part_num = atol(reply);               /* Convert from ASCII to binary. */
  55.  
  56.       /* Position file pointer at start of record for part. */
  57.       lseek(fh_inv, (long) part_num * sizeof inv_rec, 0);      
  58.  
  59.       if (cmd == 'a')                                         /* Add a part. */
  60.          {
  61.  
  62.          /* Prompt for part_desc, price, and ship_weight. */
  63.          PROMPT("\nDesc: ", 7, inv_rec.desc, 30);
  64.          PROMPT("\nPrice: ", 8, reply, 80);
  65.          inv_rec.price = atol(reply);                     /* ASCII to binary */
  66.          PROMPT("\nWeight (oz.): ", 14, reply, 80);
  67.          inv_rec.weight = atoi(reply);                    /* ASCII to binary */
  68.  
  69.          /* Output record from structure inv_rec. */
  70.          write(fh_inv, &inv_rec, sizeof inv_rec);
  71.          }
  72.       else if (cmd == 'l')                     /* Read record and list part. */
  73.          {
  74.  
  75.          /* Got whole record? Then list part_desc, price, and ship_weight. */
  76.          if (read(fh_inv, &inv_rec, sizeof inv_rec) == sizeof inv_rec)
  77.             {
  78.             write(stdout, "\nDesc: ", 7);
  79.             write(stdout, inv_rec.desc, strlen(inv_rec.desc));
  80.             write(stdout, "\nPrice: ", 8);
  81.             ltoa(inv_rec.price, buf, 10);       /* Convert price and output. */
  82.             write(stdout, buf, strlen(buf));
  83.             write(stdout, "\nWeight: ", 9);
  84.             itoa(inv_rec.weight, buf, 10);     /* Convert weight and output. */
  85.             write(stdout, buf, strlen(buf));
  86.             write(stdout, "\n\n", 2);                     /* Skip two lines. */
  87.             }  
  88.          }
  89.       }
  90.    }
  91.